package classReflectDemo;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * 获取类的基本结构信息
 * <p>
 * 属性 方法 构造
 * <p>
 * Class ：
 * <p>
 * ----getName getSimpleName
 * <p>
 * ----getFields getDeclaredFields
 * <p>
 * ----getMethods getDeclaredMethods
 * <p>
 * ----getDeclaredConstructors
 * <p>
 * Field ----属性类 public String name;
 * <p>
 * ----getModifiers 修饰符属性
 * <p>
 * ----getType 获取类型 Class类型
 * <p>
 * ----getName 属性名
 * <p>
 * Method
 * <p>
 * ----getModifiers 修饰符属性
 * <p>
 * ----getReturnType 获取类型 Class类型
 * <p>
 * ----getName 方法名
 * <p>
 * ----getParametersType 类型，Class[]
 * <p>
 * Constructor
 * <p>
 * ----getModifiers 修饰符属性
 * <p>
 * ----getName 方法名
 * <p>
 * ----getParametersType 类型，Class[]
 *
 * @author jie
 */
public class Class_GetInfo {
    public static void main(String[] args) {
        printAllFields(Student.class);
//		printAllMethods(Student.class);
        // printAllConstructors(Student.class);
    }

    // 得到所有构造函数
    public static void printAllConstructors(Class clazz) {
        // 得到该类的所有构造 不问修饰符
        Constructor[] constructors = clazz.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            // 修饰符
            System.out.print(Modifier.toString(constructor.getModifiers()) + "  ");
            // 名称
            System.out.print(constructor.getName() + " (");
            // 参数类型
            Class[] parameterTypes = constructor.getParameterTypes();
            for (Class class1 : parameterTypes) {
                // 参数类型
                System.out.print(class1.getName() + " ");
            }
            System.out.println(")");
        }
    }

    // 得到类的所有方法
    public static void printAllMethods(Class clazz) {
        // 得到所有公共 方法包括 父类的
        // Method[] methods = clazz.getMethods();
        // 得到该类 所有自定义的方法(不含父类)，不管修饰符
        Method[] methods = clazz.getDeclaredMethods();

        for (Method method : methods) {
            // 修饰符、返回类型、方法名、参数
            // 修饰符
            System.out.print(Modifier.toString(method.getModifiers()) + "  ");
            // 返回值类型
            System.out.print(method.getReturnType() + "  ");
            // 方法名
            System.out.print(method.getName() + "(");
            Class<?>[] parameterTypes = method.getParameterTypes();
            for (Class<?> class1 : parameterTypes) {
                System.out.print(class1.getName() + "  ");
            }
            System.out.println(")");
        }
    }

    // TODO 得到所有属性
    public static void printAllFields(Class clazz) {
        // 得到所有公共 属性包括 父类的
        // Field[] fields = clazz.getFields();
        // 得到该类 所有自定义的属性(不含父类)，不管修饰符
        Field[] fields = clazz.getDeclaredFields();// Field 属性类

        // 属性修饰符
        // 属性类型
        // 属性名称
        for (Field field : fields) {
            // System.out.println(field.getModifiers());//属性的修饰符 int值
            System.out.print(Modifier.toString(field.getModifiers()) + " ");// 返回Sting
            // 型
            System.out.print(field.getType().getName() + " ");// 得到属性名称 得到全类名
            // java.lang.String
            System.out.println(field.getName());// 名字
            // System.out.print("------------");
        }
    }
}

interface Fly<V> {
}

interface Run {
}

class P<T> {
    public double money;

    public void run() {
        System.out.println("跑步");
    }
}

class Student extends P<Student> implements Fly<String>, Run {
    public double weight;
    protected double score;
    int age;
    private String name;

    public Student() {
    }

    private Student(String name) {
        this.name = name;
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
    }

    public void show(String abc, int b) {
        System.out.println(name);
    }

    private void eat() {
        System.out.println("吃包子");
    }

    protected void play() {
        System.out.println("玩游戏");
    }
}